package client_commands;

import utils.Constants;
import client.ClientApplication;

/**
 * Apstraktna klasa koja predstavlja komandu. Svaka komanda sadrzi dva zajednicka
 * atributa koji jedinstveno identifikuju komandu.<br>
 * Atribut 'code' oznacava identifikacioni kod komande, dok atribut 'parameter'
 * oznacava parametar komande. Ukoliko komanda nema parametre, vrednost ovog
 * atributa je null.<br>
 * Iz ove apstraktne klase izvode se klase konkretnih komandi.
 * 
 * @author UrosKrkic & Radivoje Popovic
 */
public abstract class Command implements Constants {

	private int code;			// kod komande
	
	private String parameter;	// parametar komande
	

	/**
	 * Metod vraca kod komande.
	 * @return code komande
	 * @author UrosKrkic & Radivoje Popovic
	 */
	public int getCode() {
		return this.code;
	}
	
	/**
	 * Metod vraca parametar komande.
	 * @return parametar
	 * @author UrosKrkic & Radivoje Popovic
	 */
	public String getParameter() {
		return this.parameter;
	}
	
	/**
	 * Metod setuje kod komande.
	 * @param code - kod komande koji ce biti setovan
	 * @author UrosKrkic & Radivoje Popovic
	 */
	public void setCode(int code) {
		this.code = code;
	}
	
	/**
	 * Metod setuje parametar komande. Ukoliko komanda nema parametre,
	 * ovaj parametar se setuje na null.
	 * @param parameter - parametar koji ce biti setovan
	 * @author UrosKrkic & Radivoje Popovic
	 */
	public void setParameter(String parameter) {
		this.parameter = parameter;
	}
	

	/**
	 * Apstraktni metod koji izvrsava komandu. Za svaku konkretnu komandu ovaj
	 * metod se predefinise, tako da svaka komanda zna kako sebe da izvrsi.
	 * @param connection - konekcija server-client
	 * @return true - ako je komanda uspesno izvrsena. Inace, false.
	 * @author UrosKrkic & Radivoje Popovic
	 */
	public abstract boolean executeCommand(ClientApplication theApp);
	
}
